ECS完全理解


概要

これ 

「Unity ECS完全に理解した」

https://connpass.com/event/101774/



ドカベンさん


前提

Worldインスタンスに対してComponetSystemが1:1対応

DefaultWorld というのがデフォである。


動作

Transform、Render、EnemyGenerate、、みたいにSystemを作り、

それぞれに前提というか適応ルールをセットする。

e,g, Pos,Rotate,Scaleのどれかがあれば -> PlayerやEnemyのエンティティにヒットする。


用語の整理

ComponentData


Entity

システムに対するインデックスの定義。


var arch = entityManager.CreateArchetype(条件要素)

var entity = arch.なにやら



ECSの描画について

サンプルあり。



衝突判定

そのうち公式実装されるかも。



のたぐす


ECSでパーティクル実装するメソッド

・GOよりオーバーヘッド低い

・C#でコントロールできる


Entityを作る -> それを扱うSystemを作る -> 動かす


random.NextFloat3Direction

そんなのあるんだww



一定時間経過したら削除

ウッッッ見失った、、、



軌跡

一定個数の通った位置を保持

要素をBufferArrayで定義、生成。


RemoveAt[index]などで削除を行う。



描画

Graphics.DrawMesh

MarkDynamicでちょっと早くなる?



高速化

GPUへ送る情報を減らすと高速化できそう -> 減らす。

DrawMeshInstancedIndirect でバッチで渡す。


頂点数分の長さのパイプ(20パーツ)を作って、Trailにする。

Segment + 要素に分割


一旦データをNativeArrayに入れる -> ComputeBufferに入れる流れ。


NativeArray、Tempで毎回取得するより必要になったタイミングで獲得する流れのほうがよい -> エディタでやるとTempのほうが遅いらしい。



Es


Hybrid ECS

既存のプロダクトを手っ取り早く良くしたい

メインスレッドの占有時間を7 -> 0.4まで減らす話


Transformを扱う上では結構あり(素敵)


1つのGOから1Entityを生成

従来の開発スタイル + ECS



Hybrid特有

GOからEntityの値を書き換える、EntityからGOのコンポーネントを書き戻す

GameObjectEntityを使う。


ComponentDataWrapper を継承することで、GOに貼れる。

CopyTransformToGOSysytem というSystemが標準で提供されている。

LT


NativeSetThreadIndex アトリビュート

ほーーこんなのが。